package com.scpii.universal.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.PrototypicalNodeFactory;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.scpii.universal.pns.dto.BodyDto;

public class ContentUtil {

	private static void getChildNode(List<BodyDto> contents, NodeList nodeList) {
		for (int i = 0; i < nodeList.size(); i++) {
			Node node = nodeList.elementAt(i);
			if (node instanceof TextNode) {
				if (StringUtils.isBlank(node.toPlainTextString())) {
					continue;
				}
				if (node.getParent() instanceof LinkTag) {
					continue;
				}
				BodyDto bodyDto = new BodyDto();
				bodyDto.setType(BodyDto.TYPE_TEXT);
				bodyDto.setValue(node.toPlainTextString());
				contents.add(bodyDto);
			}
			if (node instanceof ImageTag) {
				String imageUrl = ((ImageTag) node).getImageURL();
				BodyDto bodyDto = new BodyDto();
				bodyDto.setType(BodyDto.TYPE_IMAGE);
				bodyDto.setValue(imageUrl);
				contents.add(bodyDto);
			}
			if (node instanceof LinkTag) {
				BodyDto bodyDto = new BodyDto();
				bodyDto.setType(BodyDto.TYPE_URL);
				bodyDto.setTitle(((LinkTag) node).getLinkText());
				bodyDto.setValue(((LinkTag) node).getLink());
				contents.add(bodyDto);
			}
		}
	}

	public static List<BodyDto> toContentList(String contentText) {
		if (contentText == null) {
			return null;
		}
		contentText = contentText.replaceAll("&nbsp;", " ");
		List<BodyDto> contents = new ArrayList<BodyDto>();
		Parser parser = new Parser();
		PrototypicalNodeFactory nodeFactory = new PrototypicalNodeFactory();
		nodeFactory.registerTag(new BrTagNode());
		parser.setNodeFactory(nodeFactory);
		try {
			parser.setInputHTML(contentText);
			NodeList nodeList = parser
					.extractAllNodesThatMatch(new NodeFilter() {

						private static final long serialVersionUID = 1L;

						@Override
						public boolean accept(Node node) {
							if (node instanceof BrTagNode) {
								return false;
							}
							return true;
						}
					});
			getChildNode(contents, nodeList);
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return contents.size() == 0 ? null : contents;
	}
}
